package com.illtamer.infinite.collapsar.server.pop3;

import com.illtamer.infinite.collapsar.common.CollapsarConfiguration;
import com.illtamer.infinite.collapsar.server.handler.AbstractCommandHandler;
import io.netty.channel.Channel;

/**
 * see https://www.cnblogs.com/diegodu/p/4097202.html
 * */
public class POP3CommandHandler extends AbstractCommandHandler {

    private final TransferContext context;

    public POP3CommandHandler(TransferContext context) {
        this.context = context;
    }

    @Override
    public void onCommand(String command, String content, Channel channel) {
        switch (command) {
            case "USER": {
                String[] split = content.split("@");
                if (CollapsarConfiguration.domain.equals(split[1]))
                    channel.writeAndFlush("+OK\r\n");
                else
                    channel.writeAndFlush("-ERR Unknown host\r\n");
                break;
            }
            case "PASS": {
                // TODO database verification
                // TODO 加上排它锁 防止在进入"更新"状态前对邮件的改变
                if ("123456".equals(content))
                    // 成功获得了排它锁
                    channel.writeAndFlush("+OK\r\n");
                else
                    channel.writeAndFlush("-ERR Wrong password\r\n");
                break;
            }
            case "APOP": {
                // TODO APOP
                // 使用APOP，口令在传输之前就被加密，当客户端与服务端第一次建立连接时，POP3服务器向客户端发送一个ASCII码文本的问候，这个问候是由一串字符组成对每个客户机是唯一的，内容一般都是当地时间之类的。然后客户端把它的纯文本口令附加到刚才接受的字符串之后，接着计算出新的字符串的MD5单出函数值的消息数据，最后客户机把用户名和MD5加密后的消息摘要作为APOP命令的参数一起发送到服务器。
                // name digest
                final String[] split = content.split(",");

                break;
            }
            case "STAT": {
                int amount = 1;
                long size = 666;
                channel.writeAndFlush(String.format("+OK %d %d\r\n", amount, size));
                break;
            }
            case "UIDL": {
                break;
            }
            case "LIST": {
                if (context == null) {
                    ;
                } else { // content != null

                }
                break;
            }
            case "QUIT": {
                channel.writeAndFlush("+OK\r\n");
                channel.close();
                break;
            }
        }
    }

}
